home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_09_02
/
9n02087a
< prev
next >
Wrap
Text File
|
1990-12-16
|
4KB
|
98 lines
/*
* 10-Oct-1990 - created
*/
/***********************************************************
*
* Module: _olist.h
*
* Purpose: Private include file for olist.c
*
* (c) Copyright 1990 Kenneth L. Grogan Jr.
*
**********************************************************/
#ifndef _OLIST_H
#define _OLIST_H
/* for maximum double value */
#include "float.h"
#define MIN_KEY 0
#define MAX_KEY (OLIST_NUM_KEY_TYPES - 1)
#define KEY_1_MAX UINT_MAX
#define KEY_2_MAX DBL_MAX
#define KEY_3_MAX NULL
/* for double equality test */
#define TOLERANCE 3e-8
/* set maximum key values */
#define SET_MAXIMUM_KEY_VALUES() \
max_key_value[OLIST_KEY_1].key_1 = KEY_1_MAX; \
max_key_value[OLIST_KEY_2].key_2 = KEY_2_MAX; \
max_key_value[OLIST_KEY_3].key_3 = KEY_3_MAX
/* get appropriate key type */
#define GET_KEY(key, type, key_ptr) \
if ((type) == OLIST_KEY_1) \
(key).key_1 = *((KEY_1_T *)(key_ptr)); \
else if ((type) == OLIST_KEY_2) \
(key).key_2 = *((KEY_2_T *)(key_ptr)); \
else \
(key).key_3 = *((KEY_3_T *)(key_ptr))
/* set appropriate key type */
#define SET_KEY(key, type, key_ptr) \
if ((key_ptr) != NULL) \
if ((type) == OLIST_KEY_1) \
*((KEY_1_T *)(key_ptr)) = (key).key_1;\
else if ((type) == OLIST_KEY_2) \
*((KEY_2_T *)(key_ptr)) = (key).key_2;\
else \
*((KEY_3_T *)(key_ptr)) = (key).key_3
/* key >= Maximum key value? */
#define KEY_IS_INVALID(sl, type, key_ptr) \
((type) != (sl)->key_type ? TRUE : \
((type) == OLIST_KEY_1 ? \
*((KEY_1_T *)(key_ptr)) >= UINT_MAX : \
((type) == OLIST_KEY_2 ? \
*((KEY_2_T *)(key_ptr)) >= DBL_MAX : \
*((KEY_3_T *)(key_ptr)) == NULL)))
/* key_a == key_b */
#define KEY_EQ(sl, key_a, key_b) \
((sl)->key_type == OLIST_KEY_1 ? \
(key_a).key_1 == (key_b).key_1 : \
((sl)->key_type == OLIST_KEY_2 ? \
fabs((key_a).key_2 - (key_b).key_2) <= TOLERANCE :\
((key_a).key_3 == NULL ? 0 : \
((*((sl)->compare_func))((key_a).key_3, \
(key_b).key_3)) == 0)))
/* key_a < key_b */
#define KEY_LT(sl, key_a, key_b) \
((sl)->key_type == OLIST_KEY_1 ? \
(key_a).key_1 < (key_b).key_1 : \
((sl)->key_type == OLIST_KEY_2 ? \
(key_a).key_2 < (key_b).key_2 : \
((key_a).key_3 == NULL ? 0 : \
((*((sl)->compare_func))((key_a).key_3, \
(key_b).key_3)) < 0)))
/* key data types */
typedef uint KEY_1_T;
typedef double KEY_2_T;
typedef void *KEY_3_T;
typedef union
{
KEY_1_T key_1;
KEY_2_T key_2;
KEY_3_T key_3;
} SL_KEY;
#endif /* _OLIST_H */
/*
* end of file
*/